#ifndef __RGB_H
#define __RGB_H
#include "rgb_cfg.h"
#include "user_cfg.h"

//==================================================================
/// @brief  : RGB配置
//==================================================================
#define RGB_PWM             0       //是否选用PWM  (PWM选择1, 普通IO口选择0)
#define CHANGE_COLOR        1       //灯条是否是七彩灯 (七彩灯选择1, 单色灯条选择0)
#define FADECOLOR           0       //淡入淡出模式 (选择淡入淡出模式时,需要关闭呼吸灯模式)
#define GRADCOLOR           1       //呼吸灯模式   (选择呼吸灯模式时, 需要关闭淡入淡出模式)
#define MARQ_COLOR          0       //跑马灯模式 (跑马灯默认是在七种颜色变换完之后开启,每0.5s换一次颜色)
#define GRAD_MARQ           1      //呼吸灯效果的跑马灯模式(当选择1时,需要把跑马灯模式关闭,常规七彩灯模式无呼吸跑马灯)
#define LIGHT_GRADE         0       //光照亮度是否可调  (0不可调,1可调)
#define INPUT_RGB           0       //自定义颜色



// 32位机
#define RGB_B_PORT						GPIOA
#define RGB_B_PIN						GPIO_PIN_3
#define RGB_G_PORT						GPIOA
#define RGB_G_PIN						GPIO_PIN_4
#define RGB_R_PORT						GPIOA
#define RGB_R_PIN						GPIO_PIN_5


// ==================================================================
/// @brief  : RGB_CFG
// ==================================================================
#define DEV_G_LED                       0               /*!<绿色LED*/
#define DEV_B_LED                       1               /*!<蓝色LED*/
#define DEV_R_LED                       2               /*!<红色LED*/
#define DEV_NUM                         3               /*!<PWM设备总数量，用于维护结构体数组*/

#if RGB_PWM
    #if CHANGE_COLOR
        #define RGB_R           (PWM1)          //括号里面定义引脚的PWM
        #define RGB_G           (PWM2)
        #define RGB_B           (PWM0)
    #else
        #define DEV_LED         (PWM0)          //括号里面定义引脚的PWM
    #endif
#else
    #if CHANGE_COLOR
        #define RGB_R           (rgb_para.light_sta.red)           //括号里面填写对应的IO口
        #define RGB_G           (rgb_para.light_sta.green)
        #define RGB_B           (rgb_para.light_sta.blue)
    #else
        #define DEV_LED         (P01)              //括号里面填写对应的IO口
    #endif
#endif


#if CHANGE_COLOR
    #if RGB_PWM                                 //带PWM
        #define MIN_FADE_CNT            0       //最小的淡出值
        #define MAX_FADE_CNT            255     //最大的淡入值
        #define FADE_MIN_CNT            1       /*!<淡入淡出最小单元值*/
        #if FADECOLOR
            #define FADE_MUL_ENABLE          /*!<淡入淡出开启倍数功能,放慢速度*/
            // #define RGB_LED_ENABLE           /*!<淡入倍数,RGB切灯光不做淡出效果*/
        #endif
        #if (GRADCOLOR || GRAD_MARQ)
        #define GRAD_MUL_ENABLE                 /*!<呼吸灯开启倍数功能,放慢呼吸速度(呼吸时必须开启)*/
        #endif
        #if MARQ_COLOR
        #define MARQ_TIMEOUT           500      // 跑马灯换色的间隔时基  ms
        #endif
    #else                                       //不带PWM
        #define MIN_FADE_CNT            0       //最小的淡出值
        #define MAX_FADE_CNT            255     //最大的淡入值
        #define FADE_MIN_CNT            1       /*!<淡入淡出最小单元值*/
            // #define FADE_MUL_ENABLE          /*!<淡入淡出开启倍数功能,放慢速度*/
            // #define RGB_LED_ENABLE           /*!<淡入倍数,RGB切灯光不做淡出效果*/
        #define GRAD_MUL_ENABLE                 /*!<开启倍数功能,放慢呼吸/淡入淡出速度*/
        #if MARQ_COLOR
        #define MARQ_TIMEOUT           500      // 跑马灯换色的间隔时基  ms
        #endif
    #endif
#else
    #if (FADECOLOR || GRADCOLOR)
        #define MIN_FADE_CNT            0       //最小的淡出值
        #define MAX_FADE_CNT            1000    //最大的淡入值
        #define FADE_MIN_CNT            1       /*!<淡入淡出最小单元值*/
        // #define FADE_MUL_ENABLE              /*!<开启倍数功能,放慢速度*/
        // #define RGB_LED_ENABLE               /*!<淡入倍数,RGB切灯光不做淡出效果*/
    #elif GRADCOLOR

    #endif
#endif

/**
 * @description: 使用1ms作为时基，肉眼感觉有点快，可以开启倍数功能，放慢速度
 */
#ifdef FADE_MUL_ENABLE
    #ifdef RGB_LED_ENABLE
        #define FADE_IN_MUL_CNT                 4               /*!<淡入倍数,RGB切灯光不做淡出效果*/
    #else
        #define FADE_IN_MUL_CNT                 9               /*!<淡入倍数*/
        #define FADE_OUT_MUL_CNT                10              /*!<淡出倍数*/
    #endif
#endif

#if RGB_PWM
    #ifdef GRAD_MUL_ENABLE
        #define GRAD_MUL_CNT                    6              /*!<呼吸灯频率设置, ms*/
    #endif
#else
    #ifdef GRAD_MUL_ENABLE
        #define GRAD_MUL_CNT                    7              /*!<呼吸灯频率设置, ms(不带pwm)*/
    #else
        #define GRAD_MUL_CNT                    0              /*!<不设置呼吸灯频率时*/
    #endif
#endif

// ==================================================================
/// @brief  : RGB的工作状态
// ==================================================================
typedef enum {
    OFF = 0,                //RGB关闭
    ON,                     //RGB开启
    CHANGE,                    //RGB变色
} rgb_state_t;

// ==================================================================
/// @brief  : 淡入淡出的状态
// ==================================================================
typedef enum {
    FADE_OFF = 0,                //淡入淡出完成
    FADE_IN,                     //淡入状态(进行中)
    FADE_OUT,                    //淡出状态(进行中)
} fade_state_t;

// ==================================================================
/// @brief  : RGB颜色
// ==================================================================
typedef enum {
    CLS = 0,            //颜色关闭
    RED,
    GREEN,
    BLUE,
    YELLOW,
    CYAN,
    PURPLE,
    WHITE,
    MARQ,               //跑马灯
} rgb_color_t;

// ==================================================================
/// @brief  : RGB的参数
// ==================================================================
typedef struct {
    rgb_state_t sta;                                            /*!<设置pwm设备工作状态*/
    rgb_u8_t rgb_flag;                                          //RGB灯条的开关状态
    rgb_u8_t duty_flag;                                         //RGB占空比状态
    rgb_u8_t press_flag;                                        //按下的状态
    rgb_u8_t marq_flag;                                         //跑马灯状态
    rgb_u8_t light_cnt;                                         //可调光的亮度
    rgb_color_t color_sta;                                      //设备的颜色状态
    rgb_color_t marq_sta;                                       //跑马灯的颜色状态
	struct {
		rgb_u8_t red;
		rgb_u8_t green;
		rgb_u8_t blue;
	} light_sta;

    struct {
        rgb_u8_t cur_color;                                     //RGB的当前颜色
        rgb_u8_t mul_cnt;                                        /*!<倍数，默认1ms，感觉太快了*/
        rgb_u16_t pwm_cur_cnt;                                   /*!<pwm计数器*/
        rgb_u16_t fade_cnt;                                      /*!<淡入淡出计数器*/
        fade_state_t fade_sta;                                   /*!<pwm设备淡入淡出状态*/
        struct {
            rgb_u8_t sta;                                       //RGB的工作模式状态
            rgb_u8_t duty;                                      //占空比变换的状态
        } flag;
        struct {
            rgb_u16_t cnt;
        } duty;
    } dev[DEV_NUM];
} rgb_para_t;

extern rgb_para_t rgb_para;

//==================================================================
/// @brief  : 自定义颜色时RGB参数
//==================================================================
typedef struct {
    unsigned char r;    // 0-255
    unsigned char g;    // 0-255
    unsigned char b;    // 0-255
    unsigned long color; // 0x000000 ~ 0xffffff
} color_rgb_t;
extern color_rgb_t color_rgb;

// ==================================================================
/// @brief  : 灯条的控制初始化,必须调用
// ==================================================================
void Rgb_Init(void);

// ==================================================================
/// @brief  : sta设置的状态, 单色灯条ON开, 七彩灯条CHANGE开, OFF关闭
// ==================================================================
void Pwm_Sta_Set(rgb_state_t sta);

// ==================================================================
/// @brief  : RGB处理,必须调用
// ==================================================================
void Rgb_Isr_Process(void);

// ==================================================================
/// @brief  : 灯条的底层初始化
// ==================================================================
void Rgb_Port_Init(void);

// ==================================================================
/// @brief  : 灯条引脚处理  dev 操作的pwm口, start_value 初值的占空比
//  end_value 改变过后的占空比 (占空比取值范围是 0 ~ 255)
// mode 选择模式 ON/OFF 开关, change 占空比循环
// ==================================================================
void Rgb_Opt_Port(rgb_u8_t id, rgb_u16_t pwm_set);

// ==================================================================
/// @brief  : 灯条时基获取
// ==================================================================
rgb_u32_t Rgb_Clk_Get(void);

//==================================================================
/// @brief  : RGB颜色处理函数
//==================================================================
void Rgb_Color_Handle(rgb_color_t color);

//==================================================================
/// @brief  : 常规七彩处理,不带模式
//==================================================================
void Change_Process(rgb_color_t color);

//==================================================================
/// @brief  : RGB处理(放入主循环,在IO口不是PWM的情况下使用)
//==================================================================
void Rgb_Process(void);

//==================================================================
/// @brief  : v光照亮度, rgb颜色代码
//==================================================================
// void Scan_Rgb(rgb_u8_t v, color_rgb_t rgb);

#endif

